﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://www.acwing.com/problem/content/95/
/*
从 1∼n
 这 n
 个整数中随机选出 m
 个，输出所有可能的选择方案。

输入格式
两个整数 n,m
 ,在同一行用空格隔开。

输出格式
按照从小到大的顺序输出所有方案，每行 1
 个。

首先，同一行内的数升序排列，相邻两个数用一个空格隔开。

其次，对于两个不同的行，对应下标的数一一比较，字典序较小的排在前面（例如 1 3 5 7 排在 1 3 6 8 前面）。

数据范围
n>0
 ,
0≤m≤n
 ,
n+(n−m)≤25
输入样例：
5 3
输出样例：
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
思考题：如果要求使用非递归方法，该怎么做呢？
*/
// 开始解题：
// 方法——dfs
#include <iostream>
#include <cstdio>
using namespace std;
int n, m;
int path[30];

void dfs(int pos, int start) {
    if (pos == m + 1) {
        for (int i = 1; i <= m; i++) {
            printf("%d ", path[i]);
        }
        puts("");
        return;
    }
    for (int i = start; i <= n; i++) {
        path[pos] = i;
        dfs(pos + 1, i + 1);
        // 回溯恢复现场
        path[pos] = 0;
    }
}

int main() {
    scanf("%d%d", &n, &m);
    dfs(1, 1);

    return 0;
}

